#include <stdio.h>  
#include <stdlib.h>  
#include <pthread.h>  
#include <unistd.h> // 用于sleep函数  
  
// 定义一个结构体来存储计算结果  
typedef struct {  
    int result;  
} CalculationResult;  
  
// 第一个线程函数，用于计算并存储结果  
void *calculate_result(void *arg) {  
    int a = 10, b = 20;  
    CalculationResult *result = (CalculationResult *)malloc(sizeof(CalculationResult));  
    if (result == NULL) {  
        perror("Failed to allocate memory for result");  
        pthread_exit(NULL);  
    }  
  
    result->result = a + b; // 假设的计算操作  
  
    printf("Calculation thread: %d + %d = %d\n", a, b, result->result);  
  
    // 通过返回值传递结果  
    pthread_exit((void *)result);  
}  
  
// 第二个线程函数，模拟耗时操作  
void *simulate_work(void *arg) {  
    printf("Work thread: Simulating work...\n");  
    sleep(2); // 等待2秒  
    printf("Work thread: Done simulating work.\n");  
    pthread_exit(NULL);  
}  
  
int main() {  
    pthread_t tid1, tid2;  
    void *thread_result;  
    CalculationResult *result;  
  
    // 创建第一个线程  
    if (pthread_create(&tid1, NULL, calculate_result, NULL) != 0) {  
        perror("Failed to create calculation thread");  
        return 1;  
    }  
  
    // 创建第二个线程  
    if (pthread_create(&tid2, NULL, simulate_work, NULL) != 0) {  
        perror("Failed to create work thread");  
        return 1;  
    }  
  
    // 等待第一个线程完成并获取结果  
    if (pthread_join(tid1, &thread_result) != 0) {  
        perror("Failed to join calculation thread");  
        return 1;  
    }  
  
    result = (CalculationResult *)thread_result;  
    printf("Main thread: Received result from calculation thread: %d\n", result->result);  
    free(result); // 释放之前分配的内存  
  
    // 等待第二个线程完成（尽管在这个例子中它不是必需的，因为主线程已经等待了第一个线程）  
    if (pthread_join(tid2, NULL) != 0) {  
        perror("Failed to join work thread");  
        return 1;  
    }  
  
    printf("Main thread: Both threads have finished.\n");  
  
    return 0;  
}